package app.Cliente;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Pedro Santos
 */
public class ClientUdp implements Runnable {

    private DatagramSocket socket;
    private DatagramPacket pacote;
    private InetAddress endereço;
    private Controller control;
    private boolean flag;
    private int porta;
    private byte mensagem[];
    /*
     * O construtor da Classe recebe o array de bytes A classe empacota o array
     * e envia. Criar um novo Cliente a cada mensagem.
     */

    public ClientUdp(Controller control) {
        this.control = control;
    }

    public ClientUdp(Controller control, int port) {
        this.control = control;
        this.porta = port;
    }

    public ClientUdp(InetAddress address, int port, byte message[]) {
        this.endereço = address;
        this.porta = port;
        this.mensagem = message;
        try {
            socket = new DatagramSocket(7071);// Usa a port 8081
            pacote = new DatagramPacket(mensagem, mensagem.length, endereço, porta);
            socket.send(pacote);
            socket.close();
        } catch (IOException io) {
            System.out.println("ERRO NA CONEXÂO!");
        }
    }

    public void enviar(InetAddress address, int port, byte message[]) {
        this.endereço = address;
        this.porta = port;
        this.mensagem = message;
        int count = 0;
        try {
            socket = new DatagramSocket(7071);
        } catch (SocketException ex) {
            Logger.getLogger(ClientUdp.class.getName()).log(Level.SEVERE, null, ex);
        }
        pacote = new DatagramPacket(mensagem, mensagem.length, endereço, porta);
        while (count < 10 && !flag) {
            count++;
            try {
                socket.send(pacote);
            } catch (IOException ex) {
                Logger.getLogger(ClientUdp.class.getName()).log(Level.SEVERE, null, ex);
            }
            new Thread(this).start();
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
                Logger.getLogger(ClientUdp.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        if (count == 10) {
            JOptionPane.showMessageDialog(null, "Erro de Conexao");
        }
        socket.close();
        flag = false;
    }

    public void send(InetAddress address, int port, int myport, byte message[]) {
        this.endereço = address;
        this.porta = port;
        this.mensagem = message;
        int count = 0;
        try {
            socket = new DatagramSocket(myport);// Usa a port 9089
        } catch (SocketException ex) {
            Logger.getLogger(ClientUdp.class.getName()).log(Level.SEVERE, null, ex);
        }
        pacote = new DatagramPacket(mensagem, mensagem.length, endereço, porta);
        try {
            socket.send(pacote);
        } catch (IOException ex) {
            Logger.getLogger(ClientUdp.class.getName()).log(Level.SEVERE, null, ex);
        }
        socket.close();
    }

    @Override
    public void run() {
        byte[] resposta = new byte[1024];
        DatagramPacket receivePacket = new DatagramPacket(resposta, resposta.length);
        try {
            socket.receive(receivePacket);
        } catch (IOException ex) {
            Logger.getLogger(ClientUdp.class.getName()).log(Level.SEVERE, null, ex);
        }
        this.flag = true;
    }
}